package com.epoint.java8;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * lambda表达式学习
 *
 * 1.举例： (o1,o2)-> Integer.compare(o1,o2);
 *
 * 2.格式：
 *      -> :lambda操作符 或 箭头操作符
 *      ->左边：lambda形参列表
 *      ->右边：lambda体：其实就是重写的抽象放的方法体
 * 3.lambda分6种使用
 *      总结：
 *          ->左边：lambda形参类型可以省略；如果形参只有一个，可以省略 （）
 *          ->右边：如果只有一个执行语句（可能是return），可以省略大括号以及return
 * 4.lambda本质：接口的实现对象
 *
 * 5.从前我就像在想，为啥java不能和js一样把方法作为对象、作为参数传来传去呢？
 *      果然现在来了，如果你是函数式接口那么你就可以使用lambda表达式把方法作为参数传过去。
 *      什么是函数式接口？当一个接口里只有一个抽象方法的时候，成为函数式接口
 *
 */
public class LambdaDemo {

    /**
     * 1.无参，无返回值
     */
    @Test
    public void test1(){
        Runnable ri = new Runnable() {
            public void run() {
                System.out.println("我是纪宽豪");
            }
        };

        ri.run();

        System.out.println("-----------------------------------");

        Runnable r2 = () -> {
            System.out.println("我是纪宽豪");
        };

        r2.run();
    }

    /**
     * 2.需要一个参数，无返回值
     */
    @Test
    public void test2(){
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };

        con.accept("我是纪宽豪");

        System.out.println("-----------------------------------");

        Consumer<String> con2 = (String s) -> {
            System.out.println(s);
        };

        con2.accept("我是纪宽豪");
    }

    /**
     * 3.数据类型可以省略，因为由编辑器推断得出，称为“类型推断”
     */
    @Test
    public void test3(){
        Consumer<String> con = (String s) -> {
            System.out.println(s);
        };

        con.accept("我是纪宽豪");

        System.out.println("-----------------------------------");

        Consumer<String> con2 = (s) -> {
            System.out.println(s);
        };

        con2.accept("我是纪宽豪");
    }

    /**
     * 4.lambda 只需要一个参数时，参数二点小括号可以省略
     */
    @Test
    public void test4(){
        Consumer<String> con = (s) -> {
            System.out.println(s);
        };

        con.accept("我是纪宽豪");

        System.out.println("-----------------------------------");

        Consumer<String> con2 = s -> {
            System.out.println(s);
        };

        con2.accept("我是纪宽豪");
    }

    /**
     * 5.lambda 需要2个或以上的参数，多条执行语句，并且可以有返回值
     */
    @Test
    public void test5(){
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return Integer.compare(o1, o2);
            }
        };

        com.compare(1,2);

        System.out.println("-----------------------------------");

        Comparator<Integer> com2 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return Integer.compare(o1, o2);
        };

        com2.compare(100,50);
    }

    /**
     * 6.lambda 只有一条语句的时候，return、{}大括号都可以省略
     */
    @Test
    public void test6(){
        Comparator<Integer> com = (o1, o2) -> {
            return Integer.compare(o1, o2);
        };

        com.compare(100,50);

        System.out.println("-----------------------------------");

        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);

        com2.compare(100,50);
    }



}
